package com.kmxd.ams.core.satoken;

import cn.dev33.satoken.interceptor.SaInterceptor;
import cn.dev33.satoken.router.SaHttpMethod;
import cn.dev33.satoken.router.SaRouter;
import cn.dev33.satoken.stp.StpUtil;
import com.kmxd.ams.core.util.StpAppUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.compress.utils.Lists;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import java.util.List;

/**
 * Sa Token 注册拦截器
 *
 * @author admin
 */
@Slf4j
@Configuration
public class SaTokenConfig implements WebMvcConfigurer {

  private static final String APP_API_URL_PATTERN = "/app/api/**";

  private static final List<String> IGNORE_URL = Lists.newArrayList();

  static {
    IGNORE_URL.add("/");
    IGNORE_URL.add("/index");

    IGNORE_URL.add("/SysIndex/index");
    // 重定向文件
    IGNORE_URL.add("/SysIndex/relay");
    // 登录
    IGNORE_URL.add("/system/login");
    IGNORE_URL.add("/system/logout");
    // 修改密码
    IGNORE_URL.add("/system/changePassword");
    // 验证码
    IGNORE_URL.add("/system/captcha");
    // 系统初始化
    IGNORE_URL.add("/system/common/initSystemStatus");
    IGNORE_URL.add("/system/common/initSystem");
    // 报表相关
    IGNORE_URL.add("/ureport/**");
    // 单点登录相关
    IGNORE_URL.add("/sso/**");

    IGNORE_URL.add("/images/**");
    IGNORE_URL.add("/favicon.ico");
    IGNORE_URL.add("/druid/**");
    IGNORE_URL.add("/swagger**/**");
    IGNORE_URL.add("/**/api-docs/**");
    IGNORE_URL.add("/webjars/**");
    IGNORE_URL.add("/pdfViewer/**");
    IGNORE_URL.add("/SCOFDReader/**");
    IGNORE_URL.add("/assets/**");
    IGNORE_URL.add("/resource/**");

    IGNORE_URL.add("/doc.html");
    // 静态资源
    IGNORE_URL.add("/**/*.html");
    IGNORE_URL.add("/**/index.html.gz");
    IGNORE_URL.add("/**/_app.config.js");
    IGNORE_URL.add("/**/favicon.ico");
    IGNORE_URL.add("/**/index.html.gz");
    IGNORE_URL.add("/**/*.css");
    IGNORE_URL.add("/**/*.js");
    IGNORE_URL.add("/**/*.png");
    IGNORE_URL.add("/**/*.jpg");
    IGNORE_URL.add("/**/*.jpeg");
    IGNORE_URL.add("/**/*.json");
    IGNORE_URL.add("/resource/**");
    IGNORE_URL.add("/assets/**");
    IGNORE_URL.add("static/**");
    IGNORE_URL.add("public/**");
    IGNORE_URL.add("/oss/ossAttachment/show");
    IGNORE_URL.add("/openapi/receive/putArchivingDocuments");
    IGNORE_URL.add("/oss/efileRecord/previewStream");
    IGNORE_URL.add("/oss/ossAttachment/previewStream");
    IGNORE_URL.add("/archive/archiveSeal/downSealStream");
    IGNORE_URL.add("/amsWebsocket");
    IGNORE_URL.add("/amsWebsocket/**");
    IGNORE_URL.add("/openapi/receive/putArchivingDocuments");
    IGNORE_URL.add("/idCardTest/readMsg");
  }

  @Override
  public void addInterceptors(InterceptorRegistry registry) {
    // 注册路由拦截器，自定义认证规则
    registry.addInterceptor(
        new SaInterceptor(
            (handler) -> {
              SaRouter.match(SaHttpMethod.OPTIONS).free(r -> {}).back();
              if (SaRouter.isMatchCurrURI(APP_API_URL_PATTERN)) {
                SaRouter.match(APP_API_URL_PATTERN)
                    .notMatch(IGNORE_URL)
                    .check(
                        () -> {
                          StpAppUtil.checkLogin();
                        });
              } else {
                SaRouter.match("/**")
                    .notMatch(IGNORE_URL)
                    .check(
                        () -> {
                          StpUtil.checkLogin();
                        });
              }
            }));
    registry.addInterceptor(new SaInterceptor()).addPathPatterns("/**");
  }
}
